package com.techsoul.module.order.service.impl;

import com.techsoul.common.core.constant.ApiConstants;
import com.techsoul.common.core.pojo.vo.UserVo;
import com.techsoul.common.core.service.RedisService;
import com.techsoul.common.core.util.ServletUtils;
import com.techsoul.common.core.util.collection.ListUtils;
import com.techsoul.common.security.service.TokenService;
import com.techsoul.module.goods.pojo.vo.SkuVo;
import com.techsoul.module.goods.pojo.vo.SpuVo;
import com.techsoul.module.goods.service.ISkuService;
import com.techsoul.module.goods.service.ISpuService;
import com.techsoul.module.order.pojo.param.CartItem;
import com.techsoul.module.order.service.ICartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@Transactional(readOnly = true)
public class CartServiceImpl implements ICartService {

    @Autowired
    private TokenService tokenService;

    @Autowired
    private RedisService redisService;

    @Autowired
    private ISkuService skuService;

    @Autowired
    private ISpuService spuService;

    /**
     * 添加商品到购物车
     * @param params
     */
    @Override
    public void addGoods(CartItem params) {
        CartItem cartItem = null;
        UserVo user = tokenService.getLoginUser(ServletUtils.getRequest()).getUser();
        Object cartItemObj = redisService.getCacheMapValue(ApiConstants.CART_PREFIX + params.getType() + ":" + user.getId(), params.getSkuId());
        if (cartItemObj != null) { //商品已存在购物车
            // 商品数量自增1
            cartItem = (CartItem)cartItemObj;
            Integer qty = cartItem.getQty();
            cartItem.setQty(qty == null ? 1 : qty + 1);
        } else {
            // 获取商品信息
            SkuVo skuVo = skuService.findById(params.getSkuId());
            if (skuVo == null) {
                return;
            }
            cartItem = new CartItem();
            cartItem.setSpuId(skuVo.getSpuId())
                    .setSkuId(skuVo.getId())
                    .setSpuName(skuVo.getSpu().getSpuName())
                    .setModel(skuVo.getSpu().getModel())
                    .setQty(1)
                    .setImage(skuVo.getImage())
                    .setIsChecked(ApiConstants.N);
        }
        redisService.setCacheMapValue(ApiConstants.CART_PREFIX + params.getType() + ":" + user.getId(), params.getSkuId(), cartItem);
    }

    /**
     * 添加商品集合到购物车
     * @param cartItems
     */
    @Override
    public void addGoodsList(List<CartItem> cartItems) {
        if (ListUtils.isNotEmpty(cartItems)) {
            cartItems.forEach(cartItem -> this.addGoods(cartItem));
        }
    }

    /**
     * 删除购物车商品
     * @param skuId
     */
    @Override
    public void delGoods(String type, String skuId) {
        UserVo user = tokenService.getLoginUser(ServletUtils.getRequest()).getUser();
        redisService.deleteCacheMapValue(ApiConstants.CART_PREFIX + type + ":" + user.getId(), skuId);
    }

    /**
     * 删除选中的购物车商品
     */
    @Override
    public void delCheckedGoods(String type) {
        UserVo user = tokenService.getLoginUser(ServletUtils.getRequest()).getUser();
        Map<String, Object> cartItemMap = redisService.getCacheMap(ApiConstants.CART_PREFIX + type + ":" + user.getId());
        if (cartItemMap != null) {
            Collection<Object> cartItems = cartItemMap.values();
            cartItems.forEach(cartItemObj -> {
                if (cartItemObj != null) {
                    CartItem cartItem = (CartItem)cartItemObj;
                    if (ApiConstants.Y.equals(cartItem.getIsChecked())) {
                        this.delGoods(type, cartItem.getSkuId());
                    }
                }
            });
        }
    }

    /**
     * 编辑购物车商品
     * @param params
     */
    @Override
    public void editGoods(CartItem params) {
        UserVo user = tokenService.getLoginUser(ServletUtils.getRequest()).getUser();
        Object cartItemObj = redisService.getCacheMapValue(ApiConstants.CART_PREFIX + params.getType() + ":" + user.getId(), params.getSkuId());
        if (cartItemObj != null) {
            CartItem cartItem = (CartItem)cartItemObj;
            // 更新商品数量
            if (params.getQty() != null) {
                cartItem.setQty(params.getQty());
            }
            // 更新商品零售价
            if (params.getPrice() != null) {
                cartItem.setPrice(params.getPrice());
            }
            // 更新选中状态
            if (params.getIsChecked() != null) {
                cartItem.setIsChecked(params.getIsChecked());
            }
            redisService.setCacheMapValue(ApiConstants.CART_PREFIX + params.getType() + ":" + user.getId(), params.getSkuId(), cartItem);
        }
    }

    /**
     * 是否全选购物车商品
     * @param params
     */
    @Override
    public void isCheckedAll(CartItem params) {
        UserVo user = tokenService.getLoginUser(ServletUtils.getRequest()).getUser();
        Map<String, Object> cartItemMap = redisService.getCacheMap(ApiConstants.CART_PREFIX + params.getType() + ":" + user.getId());
        if (cartItemMap != null) {
            String isChecked = "true".equals(params.getIsCheckedAll()) ? ApiConstants.Y : ApiConstants.N;
            Collection<Object> cartItems = cartItemMap.values();
            cartItems.forEach(cartItemObj -> {
                if (cartItemObj != null) {
                    CartItem cartItem = (CartItem)cartItemObj;
                    cartItem.setIsChecked(isChecked)
                            .setType(params.getType());
                    this.editGoods(cartItem);
                }
            });
        }
    }

    /**
     * 购物车商品列表
     * @return
     */
    @Override
    public List<CartItem> goodsList(String type) {
        List<CartItem> cartItems = null;
        UserVo user = tokenService.getLoginUser(ServletUtils.getRequest()).getUser();
        Map<String, Object> cartItemMap = redisService.getCacheMap(ApiConstants.CART_PREFIX + type + ":" + user.getId());
        if (cartItemMap != null) {
            cartItems = new ArrayList<>();
            for (Object obj : cartItemMap.values()) {
                if (obj != null) {
                    CartItem cartItem =  (CartItem)obj;
                    SpuVo spuVo = spuService.findById(cartItem.getSpuId());
                    cartItem.setPrice(spuVo.getPrice())
                            .setWholesalePrice(spuVo.getWholesalePrice());
                    cartItems.add(cartItem);
                }
            }
        }
        return cartItems;
    }

    /**
     * 购物车中选中的商品列表
     * @return
     */
    @Override
    public List<CartItem> checkedGoodsList(String type) {
        List<CartItem> checkedCartItems = null;
        List<CartItem> cartItems = this.goodsList(type);
        if (ListUtils.isNotEmpty(cartItems)) {
            checkedCartItems = cartItems.stream().filter(cartItem -> ApiConstants.Y.equals(cartItem.getIsChecked())).collect(Collectors.toList());
        }
        return checkedCartItems;
    }

}
